﻿using AutoMapper;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using System.Text;
using Gestion.Common.Extensions;
using GestionSaludOcupacional.Portal.Base;
using GestionSaludOcupacional.Portal.Base.Models;
using GestionSaludOcupacional.Portal.Base.ViewModels;
using GestionSaludOcupacional.Portal.Base.ViewModels.Examenes;
using GestionSaludOcupacional.Portal.Base.ViewModels.HistoriaClinica;
using GestionSaludOcupacional.Portal.Base.ViewModels.Reportes;
using UserBook.Base.Models;
using DbUser = UserBook.Repository;

namespace GestionSaludOcupacional.Infrastructure.Mapping
{
    [Export(typeof(IMappingService))]
    public class MappingService : IMappingService
    {
        [Import]
        public DbUser.IUnitOfWork UsuarioUnitOfWork { get; set; }

        public MappingService()
        {
            #region Citas...
            Mapper.CreateMap<CitasViewModel, Cita>()
                   .ForMember(x => x.Medico, opt => opt.Ignore())
                   .ForMember(x => x.FechaCreacion, opt => opt.UseValue(DateTime.Now.ToUtc()))
                   .ForMember(x => x.IdIndividuo, opt => opt.MapFrom(s => s.IndividuoId))
                   .ForMember(x => x.TipoExamen, opt => opt.MapFrom(s => s.Examen))
                   .ForMember(x => x.FechaCita, opt => opt.MapFrom(s => (s.Fecha)))
                   .ForMember(x => x.IdMedico, opt => opt.MapFrom(s => int.Parse(s.Medico.Key)));
            Mapper.CreateMap<Cita, CitasViewModel>()
                   .ForMember(x => x.Medico, opt => opt.MapFrom(s => new Item { Key = s.Medico.Id.ToString(), Value = s.Medico.Contacto.Nombres }))
                   .ForMember(x => x.Examen, opt => opt.MapFrom(x => x.TipoExamen))
                   .ForMember(x => x.Fecha, opt => opt.MapFrom(x => x.FechaCita))
                   .ForMember(x => x.IndividuoId, opt => opt.MapFrom(x => x.IdIndividuo));
            Mapper.CreateMap<Cita, Data.Cita>();
            Mapper.CreateMap<Data.Cita, Cita>();
            #endregion

            #region Individuo...

            Mapper.CreateMap<Individuo, Data.Individuo>()
                .ForMember(f => f.Citas, opt => opt.Ignore());

            Mapper.CreateMap<Data.Individuo, Individuo>().ForMember(f => f.Citas, opt => opt.Ignore());

            Mapper.CreateMap<IndividuoViewModel, Individuo>()
                 .ForMember(f => f.Id, opt => opt.MapFrom(x => x.IndividuoId))
                .ForMember(f => f.FechaCreacion, opt => opt.UseValue(DateTime.Now.ToUtc()));
            Mapper.CreateMap<Individuo, IndividuoViewModel>()
                .ForMember(f => f.IndividuoId, opt => opt.MapFrom(x => x.Id))
                .ForMember(f => f.FechaNacimiento, opt => opt.MapFrom(x => x.FechaNacimiento.Value.ToShortDateString()));
            Mapper.CreateMap<Individuo, IndividuoDetalleViewModel>()
                .ForMember(vm => vm.FechaNacimiento, opt => opt.MapFrom(m => m.FechaNacimiento.Value.ToString()))
                .ForMember(vm => vm.IdCita, opt => opt.MapFrom(m => m.Citas.FirstOrDefault(c => c.Estado == 1).Id));


            #endregion

            #region Medico...
            Mapper.CreateMap<MedicoModel, Data.Medico>()
                .ForMember(f => f.ContactoId, opt => opt.MapFrom(m => m.Contacto.Id))
                .ForAllMembers(x => x.Condition(s => !s.IsSourceValueNull));

            Mapper.CreateMap<UserBook.Data.Contacto, Contacto>()
                 .ForMember(f => f.Empresa, opt => opt.Ignore())
                 .ForMember(f => f.Usuarios, opt => opt.Ignore());

            Mapper.CreateMap<Data.Medico, MedicoModel>()
                .ForMember(f => f.Citas, opt => opt.Ignore())
                .ForMember(f => f.Contacto, opt => opt.MapFrom(m => ObtenerContacto(m.ContactoId)));

            Mapper.CreateMap<Data.Medico, Medico>()
                .ForMember(f => f.Citas, opt => opt.Ignore())
                .ForMember(f => f.Contacto, opt => opt.MapFrom(m => ObtenerContacto(m.ContactoId)));

            #endregion

            #region Historia Clinica...

            Mapper.CreateMap<ExamenFisico, ExamenFisicoViewModel>();
            Mapper.CreateMap<Data.ExamenFisico, ExamenFisico>();
            Mapper.CreateMap<ExamenFisicoViewModel, ExamenFisico>();
            Mapper.CreateMap<ExamenFisico, Data.ExamenFisico>();

            Mapper.CreateMap<Data.Anamnesi, Anamnesi>();
            Mapper.CreateMap<Anamnesi, AnamnesisViewModel>();
            Mapper.CreateMap<AnamnesisViewModel, Anamnesi>();
            Mapper.CreateMap<Anamnesi, Data.Anamnesi>();

            Mapper.CreateMap<Data.AntecedenteEnfermedad, AntecedenteEnfermedad>();
            Mapper.CreateMap<AntecedenteEnfermedad, AntecedenteEnfermedadViewModel>();
            Mapper.CreateMap<AntecedenteEnfermedadViewModel, AntecedenteEnfermedad>();
            Mapper.CreateMap<AntecedenteEnfermedad, Data.AntecedenteEnfermedad>();

            Mapper.CreateMap<Data.FactorRiesgo, FactorRiesgo>();
            Mapper.CreateMap<FactorRiesgo, FactorRiesgoViewModel>()
                .ForMember(x => x.TiempoAntiguedadAno, opt => opt.MapFrom(source => (int?)source.TiempoAntiguedasaño))
                .ForMember(x => x.TiempoAntiguedasmes, opt => opt.MapFrom(source => (int?)source.TiempoAntiguedasmes))
                .ForMember(x => x.TiempoLaboradoAno, opt => opt.MapFrom(source => (int?)source.TiempoLaboradoAño))
                .ForMember(x => x.TiempoLaboradoMes, opt => opt.MapFrom(source => (int?)source.TiempoLaboradoMes));
            Mapper.CreateMap<FactorRiesgoViewModel, FactorRiesgo>()
                .ForMember(x => x.TiempoAntiguedasaño, opt => opt.MapFrom(source => (byte?)source.TiempoAntiguedadAno))
                .ForMember(x => x.TiempoAntiguedasmes, opt => opt.MapFrom(source => (byte?)source.TiempoAntiguedasmes))
                .ForMember(x => x.TiempoLaboradoAño, opt => opt.MapFrom(source => (byte?)source.TiempoLaboradoAno))
                .ForMember(x => x.TiempoLaboradoMes, opt => opt.MapFrom(source => (byte?)source.TiempoLaboradoMes));
            Mapper.CreateMap<FactorRiesgo, Data.FactorRiesgo>();

            Mapper.CreateMap<Data.HistoriaClinicaRegistro, HistoriaClinicaRegistro>();
            Mapper.CreateMap<HistoriaClinicaRegistro, HistoriaClinicaRegistroViewModel>()
                .ForMember(x => x.HistoriaClinicaId, opt => opt.MapFrom(source => source.IdHistoria))
                .ForMember(x => x.IdCita, opt => opt.MapFrom(source => source.IdCita))
               .ForMember(x => x.Anamnesis, opt => opt.MapFrom(source => Mapper.Map<Anamnesi, AnamnesisViewModel>(source.Anamnesis.FirstOrDefault())))
               .ForMember(x => x.Fisico, opt => opt.MapFrom(source => Mapper.Map<ExamenFisico, ExamenFisicoViewModel>(source.ExamenesFisico.FirstOrDefault())))
               .ForMember(x => x.Antecedentes, opt => opt.MapFrom(source => Mapper.Map<AntecedenteEnfermedad, AntecedenteEnfermedadViewModel>(source.AntecedentesEnfermedad.FirstOrDefault())))
               .ForMember(x => x.FactorRiesgo, opt => opt.MapFrom(source => Mapper.Map<FactorRiesgo, FactorRiesgoViewModel>(source.FactoresRiesgo.FirstOrDefault())))
               .ForMember(x => x.HistoriaClinicaDescripcion, opt => opt.Ignore())
               .ForMember(x => x.HistoriaClinicaPacienteId, opt => opt.MapFrom(source => source.HistoriaClinica.IndividuoId));

            Mapper.CreateMap<HistoriaClinicaRegistroViewModel, HistoriaClinica>()
               .ForMember(x => x.Id, opt => opt.MapFrom(source => source.HistoriaClinicaId))
               .ForMember(x => x.Descripcion, opt => opt.MapFrom(source => source.HistoriaClinicaDescripcion))
               .ForMember(x => x.FechaCreacion, opt => opt.UseValue(DateTime.Now.ToUtc()))
               .ForMember(x => x.IndividuoId, opt => opt.MapFrom(source => source.HistoriaClinicaPacienteId));
            Mapper.CreateMap<HistoriaClinicaRegistroViewModel, HistoriaClinicaRegistro>()
                .ForMember(x => x.IdHistoria, opt => opt.MapFrom(source => source.HistoriaClinicaId))
                .ForMember(x => x.IdCita, opt => opt.MapFrom(source => source.IdCita))
                .ForMember(x => x.ExamenesFisico, opt => opt.MapFrom(source => source.Fisico.MakeEnumerable()))
                .ForMember(x => x.FactoresRiesgo, opt => opt.MapFrom(source => source.FactorRiesgo.MakeEnumerable()))
                .ForMember(x => x.AntecedentesEnfermedad, opt => opt.MapFrom(source => source.Antecedentes.MakeEnumerable()))
                .ForMember(x => x.Anamnesis, opt => opt.MapFrom(source => source.Anamnesis.MakeEnumerable()))
                .ForMember(x => x.FechaCreacion, opt => opt.UseValue(DateTime.Now.ToUtc()));
            Mapper.CreateMap<HistoriaClinicaRegistro, Data.HistoriaClinicaRegistro>();
            Mapper.CreateMap<HistoriaClinicaRegistro, ReporteExamenFisicoViewModel>()
               .ForMember(x => x.HistoriaClinicaId, opt => opt.MapFrom(source => source.IdHistoria))
               .ForMember(x => x.IdCita, opt => opt.MapFrom(source => source.IdCita))
               .ForMember(x => x.Anamnesis, opt => opt.MapFrom(source => Mapper.Map<Anamnesi, AnamnesisViewModel>(source.Anamnesis.FirstOrDefault())))
               .ForMember(x => x.Fisico, opt => opt.MapFrom(source => Mapper.Map<ExamenFisico, ExamenFisicoViewModel>(source.ExamenesFisico.FirstOrDefault())))
               .ForMember(x => x.Antecedentes, opt => opt.MapFrom(source => Mapper.Map<AntecedenteEnfermedad, AntecedenteEnfermedadViewModel>(source.AntecedentesEnfermedad.FirstOrDefault())))
               .ForMember(x => x.FactorRiesgo, opt => opt.MapFrom(source => Mapper.Map<FactorRiesgo, FactorRiesgoViewModel>(source.FactoresRiesgo.FirstOrDefault())))
               .ForMember(x => x.HistoriaClinicaDescripcion, opt => opt.Ignore())
               .ForMember(x => x.HistoriaClinicaPacienteId, opt => opt.MapFrom(source => source.HistoriaClinica.IndividuoId))
               .ForMember(x => x.NoIdentificacion, opt => opt.MapFrom(source => source.HistoriaClinica.Individuo.NoIdentificacion))
               .ForMember(x => x.Nombres, opt => opt.MapFrom(source => source.HistoriaClinica.Individuo.Nombres))
               .ForMember(x => x.PrimerApellido, opt => opt.MapFrom(source => source.HistoriaClinica.Individuo.PrimerApellido))
               .ForMember(x => x.SegundoApellido, opt => opt.MapFrom(source => source.HistoriaClinica.Individuo.SegundoApellido))
               .ForMember(x => x.TipoIdentificacion, opt => opt.MapFrom(source => source.HistoriaClinica.Individuo.TipoIdentificacion));


            Mapper.CreateMap<HistoriaClinica, Data.HistoriaClinica>()
                .ForMember(x => x.HistoriaClinicaRegistros, opt => opt.MapFrom(source => source.HistoriaClinicaRegistros.ToArray()));
            Mapper.CreateMap<Data.HistoriaClinica, HistoriaClinica>()
                .ForMember(x => x.HistoriaClinicaRegistros, opt => opt.MapFrom(source => source.HistoriaClinicaRegistros.ToArray()));

            #endregion

            #region Examenes...

            Mapper.CreateMap<ExamenVision, Data.ExamenVision>();
            Mapper.CreateMap<Data.ExamenVision, ExamenVision>();
            Mapper.CreateMap<ExamenVisionViewModel, ExamenVision>();
            Mapper.CreateMap<ExamenVision, ExamenVisionViewModel>();
            Mapper.CreateMap<ExamenVision, ReporteExamenVisionViewModel>()
                .ForMember(x => x.NoIdentificacion,
                           opt => opt.MapFrom(source => source.Individuo.NoIdentificacion.ToString()))
                .ForMember(x => x.Nombres, opt => opt.MapFrom(source => source.Individuo.Nombres))
                .ForMember(x => x.PrimerApellido, opt => opt.MapFrom(source => source.Individuo.PrimerApellido))
                .ForMember(x => x.SegundoApellido, opt => opt.MapFrom(source => source.Individuo.SegundoApellido))
                .ForMember(x => x.TipoIdentificacion, opt => opt.MapFrom(source => source.Individuo.TipoIdentificacion));


            Mapper.CreateMap<ExamenPsicosensometria, Data.ExamenPsicosensometria>();
            Mapper.CreateMap<Data.ExamenPsicosensometria, ExamenPsicosensometria>();

            Mapper.CreateMap<ExamenPsicosensometriaViewModel, ExamenPsicosensometria>();
            Mapper.CreateMap<ExamenPsicosensometria, ExamenPsicosensometriaViewModel>();
            Mapper.CreateMap<ExamenPsicosensometria, ReporteExamenPsicosensometricoViewModel>()
                .ForMember(x => x.NoIdentificacion,
                           opt => opt.MapFrom(source => source.Individuo.NoIdentificacion.ToString()))
                .ForMember(x => x.Nombres, opt => opt.MapFrom(source => source.Individuo.Nombres))
                .ForMember(x => x.PrimerApellido, opt => opt.MapFrom(source => source.Individuo.PrimerApellido))
                .ForMember(x => x.SegundoApellido, opt => opt.MapFrom(source => source.Individuo.SegundoApellido))
                .ForMember(x => x.TipoIdentificacion, opt => opt.MapFrom(source => source.Individuo.TipoIdentificacion));

            Mapper.CreateMap<ExamenPsicologia, Data.ExamenPsicologia>();
            Mapper.CreateMap<Data.ExamenPsicologia, ExamenPsicologia>();

            Mapper.CreateMap<ExamenPsicologiaViewModel, ExamenPsicologia>();
            Mapper.CreateMap<ExamenPsicologia, ExamenPsicologiaViewModel>();
            Mapper.CreateMap<ExamenPsicologia, ReporteExamenPsicologiaViewModel>()
                .ForMember(x => x.NoIdentificacion,
                           opt => opt.MapFrom(source => source.Individuo.NoIdentificacion.ToString()))
                .ForMember(x => x.Nombres, opt => opt.MapFrom(source => source.Individuo.Nombres))
                .ForMember(x => x.PrimerApellido, opt => opt.MapFrom(source => source.Individuo.PrimerApellido))
                .ForMember(x => x.SegundoApellido, opt => opt.MapFrom(source => source.Individuo.SegundoApellido))
                .ForMember(x => x.TipoIdentificacion, opt => opt.MapFrom(source => source.Individuo.TipoIdentificacion));

            Mapper.CreateMap<ExamenAudicion, Data.ExamenAudicion>();
            Mapper.CreateMap<Data.ExamenAudicion, ExamenAudicion>();

            Mapper.CreateMap<ExamenAudicionViewModel, ExamenAudicion>();
            Mapper.CreateMap<ExamenAudicion, ExamenAudicionViewModel>();
            Mapper.CreateMap<ExamenAudicion, ReporteExamenAudicionViewModel>()
                .ForMember(x => x.NoIdentificacion,
                           opt => opt.MapFrom(source => source.Individuo.NoIdentificacion.ToString()))
                .ForMember(x => x.Nombres, opt => opt.MapFrom(source => source.Individuo.Nombres))
                .ForMember(x => x.PrimerApellido, opt => opt.MapFrom(source => source.Individuo.PrimerApellido))
                .ForMember(x => x.SegundoApellido, opt => opt.MapFrom(source => source.Individuo.SegundoApellido))
                .ForMember(x => x.TipoIdentificacion, opt => opt.MapFrom(source => source.Individuo.TipoIdentificacion));

            #endregion
        }

        #region Implementation of IMappingService

        #region Entities..

        public Data.Individuo GetEntity(Individuo individuo)
        {
            return Mapper.Map<Individuo, Data.Individuo>(individuo);
        }

        public Data.HistoriaClinica GetEntity(HistoriaClinica historiaClinica)
        {
            return Mapper.Map<HistoriaClinica, Data.HistoriaClinica>(historiaClinica);
        }

        public Data.HistoriaClinicaRegistro GetEntity(HistoriaClinicaRegistro historiaClinicaRegistro)
        {
            return Mapper.Map<HistoriaClinicaRegistro, Data.HistoriaClinicaRegistro>(historiaClinicaRegistro);
        }

        public Data.ExamenVision GetEntity(ExamenVision examenVision)
        {
            return Mapper.Map<ExamenVision, Data.ExamenVision>(examenVision);
        }
        public ExamenVision GetEntity(Data.ExamenVision examenVision)
        {
            return Mapper.Map<Data.ExamenVision, ExamenVision>(examenVision);
        }
        public IEnumerable<ExamenVision> GetEntity(IEnumerable<Data.ExamenVision> examenVision)
        {
            return Mapper.Map<IEnumerable<Data.ExamenVision>, IEnumerable<ExamenVision>>(examenVision);
        }

        public Data.ExamenPsicosensometria GetEntity(ExamenPsicosensometria examenPsicosensometria)
        {
            return Mapper.Map<ExamenPsicosensometria, Data.ExamenPsicosensometria>(examenPsicosensometria);
        }
        public ExamenPsicosensometria GetEntity(Data.ExamenPsicosensometria examenPsicosensometria)
        {
            return Mapper.Map<Data.ExamenPsicosensometria, ExamenPsicosensometria>(examenPsicosensometria);
        }
        public IEnumerable<ExamenPsicosensometria> GetEntity(IEnumerable<Data.ExamenPsicosensometria> examenPsicosensometria)
        {
            return Mapper.Map<IEnumerable<Data.ExamenPsicosensometria>, IEnumerable<ExamenPsicosensometria>>(examenPsicosensometria);
        }

        public Data.ExamenPsicologia GetEntity(ExamenPsicologia examenPsicologia)
        {
            return Mapper.Map<ExamenPsicologia, Data.ExamenPsicologia>(examenPsicologia);
        }
        public ExamenPsicologia GetEntity(Data.ExamenPsicologia examenPsicologia)
        {
            return Mapper.Map<Data.ExamenPsicologia, ExamenPsicologia>(examenPsicologia);
        }
        public IEnumerable<ExamenPsicologia> GetEntity(IEnumerable<Data.ExamenPsicologia> examenPsicologia)
        {
            return Mapper.Map<IEnumerable<Data.ExamenPsicologia>, IEnumerable<ExamenPsicologia>>(examenPsicologia);
        }

        public Data.ExamenAudicion GetEntity(ExamenAudicion examenAudicion)
        {
            return Mapper.Map<ExamenAudicion, Data.ExamenAudicion>(examenAudicion);
        }
        public ExamenAudicion GetEntity(Data.ExamenAudicion examenAudicion)
        {
            return Mapper.Map<Data.ExamenAudicion, ExamenAudicion>(examenAudicion);
        }
        public IEnumerable<ExamenAudicion> GetEntity(IEnumerable<Data.ExamenAudicion> examenAudicion)
        {
            return Mapper.Map<IEnumerable<Data.ExamenAudicion>, IEnumerable<ExamenAudicion>>(examenAudicion);
        }

        public Data.Medico GetEntity(MedicoModel medico)
        {
            throw new NotImplementedException();
        }

        public Data.Cita GetEntity(Cita cita)
        {
            return Mapper.Map<Cita, Data.Cita>(cita);
        }

        #endregion

        #region Models..

        public Contacto GetModel(UserBook.Data.Contacto contacto)
        {
            return Mapper.Map<UserBook.Data.Contacto, Contacto>(contacto);
        }

        public Cita GetModel(Data.Cita cita)
        {
            return Mapper.Map<Data.Cita, Cita>(cita);
        }

        public IEnumerable<Cita> GetModel(IEnumerable<Data.Cita> cita)
        {
            _allContacts = UsuarioUnitOfWork.ContactoRepository.All().ToList();
            return Mapper.Map<IEnumerable<Data.Cita>, IEnumerable<Cita>>(cita);
        }

        public Individuo GetModel(Data.Individuo individuo)
        {
            return Mapper.Map<Data.Individuo, Individuo>(individuo);
        }

        public Cita GetModel(CitasViewModel cita)
        {
            return Mapper.Map<CitasViewModel, Cita>(cita);
        }

        public Individuo GetModel(IndividuoViewModel individuo)
        {
            return Mapper.Map<IndividuoViewModel, Individuo>(individuo);
        }

        public MedicoModel GetModel(Data.Medico medico)
        {
            throw new NotImplementedException();
        }

        public HistoriaClinica GetModel(Data.HistoriaClinica historiaClinica)
        {
            return Mapper.Map<Data.HistoriaClinica, HistoriaClinica>(historiaClinica);
        }

        public HistoriaClinica GetModel(HistoriaClinicaRegistroViewModel historia)
        {
            return Mapper.Map<HistoriaClinicaRegistroViewModel, HistoriaClinica>(historia);
        }

        public HistoriaClinicaRegistro GetModelRegistro(HistoriaClinicaRegistroViewModel historia)
        {
            return Mapper.Map<HistoriaClinicaRegistroViewModel, HistoriaClinicaRegistro>(historia);
        }

        public HistoriaClinicaRegistro GetModel(Data.HistoriaClinicaRegistro historiaClinicaRegistro)
        {
            return Mapper.Map<Data.HistoriaClinicaRegistro, HistoriaClinicaRegistro>(historiaClinicaRegistro);
        }

        public ExamenVision GetModel(ExamenVisionViewModel examenVision)
        {
            return Mapper.Map<ExamenVisionViewModel, ExamenVision>(examenVision);
        }

        public ExamenPsicosensometria GetModel(ExamenPsicosensometriaViewModel examenPsicosensometria)
        {
            return Mapper.Map<ExamenPsicosensometriaViewModel, ExamenPsicosensometria>(examenPsicosensometria);
        }

        public ExamenPsicologia GetModel(ExamenPsicologiaViewModel examenPsicologia)
        {
            return Mapper.Map<ExamenPsicologiaViewModel, ExamenPsicologia>(examenPsicologia);
        }

        public ExamenAudicion GetModel(ExamenAudicionViewModel examenAudicion)
        {
            return Mapper.Map<ExamenAudicionViewModel, ExamenAudicion>(examenAudicion);
        }

        public IndividuoDetalleViewModel GetViewModelDetail(Individuo individuo)
        {
            return Mapper.Map<Individuo, IndividuoDetalleViewModel>(individuo);
        }

        #endregion

        #region ViewModels..

        public IndividuoViewModel GetViewModel(Individuo individuo)
        {
            return Mapper.Map<Individuo, IndividuoViewModel>(individuo);
        }

        public IEnumerable<IndividuoViewModel> GetViewModel(IEnumerable<Individuo> individuos)
        {
            return Mapper.Map<IEnumerable<Individuo>, IEnumerable<IndividuoViewModel>>(individuos);
        }

        public ExamenPsicosensometriaViewModel GetViewModel(ExamenPsicosensometria examenPsicosensometria)
        {
            return Mapper.Map<ExamenPsicosensometria, ExamenPsicosensometriaViewModel>(examenPsicosensometria);
        }

        public ExamenPsicologiaViewModel GetViewModel(ExamenPsicologia examenPsicologia)
        {
            return Mapper.Map<ExamenPsicologia, ExamenPsicologiaViewModel>(examenPsicologia);
        }

        public ExamenAudicionViewModel GetViewModel(ExamenAudicion examenAudicion)
        {
            return Mapper.Map<ExamenAudicion, ExamenAudicionViewModel>(examenAudicion);
        }

        public HistoriaClinicaRegistroViewModel GetViewModel(HistoriaClinicaRegistro historiaClinicaRegistro)
        {
            return Mapper.Map<HistoriaClinicaRegistro, HistoriaClinicaRegistroViewModel>(historiaClinicaRegistro);
        }

        public ReporteExamenVisionViewModel GetReportViewModel(ExamenVision examenVision)
        {
            return Mapper.Map<ExamenVision, ReporteExamenVisionViewModel>(examenVision);
        }

        public ReporteExamenAudicionViewModel GetReportViewModel(ExamenAudicion examenAudicion)
        {
            return Mapper.Map<ExamenAudicion, ReporteExamenAudicionViewModel>(examenAudicion);
        }

        public ReporteExamenPsicologiaViewModel GetReportViewModel(ExamenPsicologia examenPsicologia)
        {
            return Mapper.Map<ExamenPsicologia, ReporteExamenPsicologiaViewModel>(examenPsicologia);
        }

        public ReporteExamenPsicosensometricoViewModel GetReportViewModel(ExamenPsicosensometria examenPsicosensometria)
        {
            return Mapper.Map<ExamenPsicosensometria, ReporteExamenPsicosensometricoViewModel>(examenPsicosensometria);
        }

        public IEnumerable<IndividuoDetalleViewModel> GetAllViewModel(IEnumerable<Individuo> individuos)
        {
            return Mapper.Map<IEnumerable<Individuo>, IEnumerable<IndividuoDetalleViewModel>>(individuos);
        }

        public IEnumerable<HistoriaClinicaRegistroViewModel> GetAllViewModel(IEnumerable<HistoriaClinicaRegistro> historiaClinicaRegistros)
        {
            return
                Mapper.Map<IEnumerable<HistoriaClinicaRegistro>, IEnumerable<HistoriaClinicaRegistroViewModel>>(
                    historiaClinicaRegistros);
        }

        public IEnumerable<HistoriaClinicaRegistro> GetAllViewModel(IEnumerable<Data.HistoriaClinicaRegistro> historiaClinicaRegistros)
        {
            return
                Mapper.Map<IEnumerable<Data.HistoriaClinicaRegistro>, IEnumerable<HistoriaClinicaRegistro>>(
                    historiaClinicaRegistros);
        }

        public CitasViewModel GetViewModel(Cita individuo)
        {
            return Mapper.Map<Cita, CitasViewModel>(individuo);
        }

        public ExamenVisionViewModel GetViewModel(ExamenVision examenVision)
        {
            return Mapper.Map<ExamenVision, ExamenVisionViewModel>(examenVision);
        }

        public IEnumerable<CitasViewModel> GetViewModel(IEnumerable<Cita> citas)
        {
            return Mapper.Map<IEnumerable<Cita>, IEnumerable<CitasViewModel>>(citas);
        }

        #endregion

        public IEnumerable<Individuo> GetAllModel(IEnumerable<Data.Individuo> individuos)
        {
            return Mapper.Map<IEnumerable<Data.Individuo>, IEnumerable<Individuo>>(individuos);
        }

        public IEnumerable<MedicoModel> GetAllModel(IEnumerable<Data.Medico> medicos)
        {
            _allContacts = UsuarioUnitOfWork.ContactoRepository.All().ToList();
            return Mapper.Map<IEnumerable<Data.Medico>, IEnumerable<MedicoModel>>(medicos);
        }

        private IEnumerable<UserBook.Data.Contacto> _allContacts;

        private Contacto ObtenerContacto(int id)
        {
            var contacto = _allContacts.FirstOrDefault(x => x.Id == id);
            return GetModel(contacto);
        }

        #endregion
    }
}
